//
//  StatusListViewModel.swift
//  Weobo
//
//  Created by 史亚洲 on 16/1/20.
//  Copyright © 2016年 itcast. All rights reserved.
//

import UIKit
import AFNetworking
import SDWebImage

class StatusListViewModel: NSObject {
    
    //定义模型数组
    var statuses=[Status]()

    //2.加载首页数据
    func loadHomeData(isPulling: Bool,finished: (isSuccess: Bool) ->()) {
        let urlString = "2/statuses/home_timeline.json"
        //在字典里面加一个可选项
        guard let token = UserAccountViewModel().token else
        {
            print("用户暂时没有登录")
         
            return
            
        }
        
        var parameters = ["access_token": token]
        /*
        since_id	false	int64	若指定此参数，则返回ID比since_id大的微博（即比since_id时间晚的微博），默认为0。
        max_id	false	int64	若指定此参数，则返回ID小于或等于max_id的微博，默认为0
        */
        /*
        1.下拉刷新需要给服务器传递since_id
        2.下拉加载更多需要传递max_id参数
        3.这两个参数属于互斥参数,二者只能传递一个
        */
        var since_id: Int64 = 0
        var max_id: Int64 = 0
        if isPulling {
            
            //上拉加载更多数据
            max_id=self.statuses.last?.id ?? 0
            
            
        }else {
            //下拉刷新
            since_id = self.statuses.first?.id ?? 0
            
        }
        
        
        if since_id>0 {
            
            //添加到get请求的参数列表中
            parameters["since_id"] = "\(since_id)"
            
            
        }
        if max_id>0 {
            
            //请求更多数据
            parameters["max_id"] = "\(max_id - 1)"
            
            
        }
        
        
       NetworkTools.sharedTools.requestJSONDict(.GET, urlString: urlString, parameters: parameters) { (dict, error) -> () in
        if error != nil {
        
        finished(isSuccess: false)
            return
        }
  
            
            //转换为数组格式
            guard let array = dict!["statuses"] as? [[String : AnyObject]] else {
                finished(isSuccess: false)
                print("数据结构错误")
                return
                
            }
            
            //定义容器数组
            var tempArray = [Status]()
            
            
            
            //获取必选的字典数组,便利数组做字典转模型
            for item in array {
                
                
                let s = Status(dict: item)
                
                //添加数组元素
                tempArray.append(s)
            }
            
            //根据since_id的大小来判断是否下拉刷新
            if since_id>0 {
                
                
                //下拉刷新
                self.statuses=tempArray+self.statuses
                
            } else if max_id>0 {
                
                //上拉加载更多
                self.statuses += tempArray
                
            } else {
                //首次加载数据
                self.statuses=tempArray
                
                
            }
        
            //执行成功的回调
        self.cacheStatusSingleImage(tempArray, finished: finished)
        
        
        
        //finished(isSuccess: true)
            //测试刷新了多少条数据
            print(array.count)
            
            print("==========")
            
        }
        
    }
    //缓存单张图片
    private func cacheStatusSingleImage(array: [Status],finished:(isSuccess: Bool) -> ()){
        
        if array.count==0{
            
            //不需要下载,如果没有数据,直接return,也不要完成回调
            finished(isSuccess: true)
            return
            
        }
        
        
        
        //遍历数组,实例化群组
        let group=dispatch_group_create()
        for s in array{
            /*
            1.如果是单张图片下载,下载图片的任务是异步的,会有多个异步任务
            2.必须等待所有的异步任务执行完毕之后 再完成 结果的回调
            3.如何监听多个异步任务 结束
            4.群组异步 监听群组 得到统一回调
            */
            if let urls=s.pictureImageURLs where urls.count==1{
            
            //异步下载图片,使用群组监听,进入群组,异步任务池  任务+1
            dispatch_group_enter(group)
            
            SDWebImageManager.sharedManager().downloadImageWithURL(urls.first!, options: [], progress: nil, completed: { (_, _, _, _, _) -> Void in
                print("单张图片下载完成")
                //任务池任务-1
                dispatch_group_leave(group)
            
            })
        }
        
        
    }
        
        //群组异步下载任务完成,任务池中数量为0.一块回调
        dispatch_group_notify(group, dispatch_get_main_queue()) { () -> Void in
            //执行所有的任务完成的回调
            print("所有的图片完成下载")
            finished(isSuccess: true)
        }
    }

}
